home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / Sample Code / Sample Editors⁄Viewers / Panel Editor / Source / FramePE.cpp < prev    next >
Encoding:
Text File  |  1995-12-08  |  15.5 KB  |  560 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Panel.h
  3.  
  4.     Contains:    Panel Classes Definition
  5.  
  6.     Written by:    Steve Smith
  7.     
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9. */
  10.  
  11. // -- PanelEditor Includes --
  12.  
  13. #ifndef _FRAMEPE_
  14. #include "FramePE.h"
  15. #endif
  16.  
  17. #ifndef _PANELEDITORDEF_
  18. #include "PanelEditorDef.h"
  19. #endif
  20.  
  21. #ifndef _PANELEDITORGLOBALS_
  22. #include "PanelEditorGlobals.h"
  23. #endif
  24.  
  25. #ifndef _PANELEDITORUTILS_
  26. #include "PanelEditorUtils.h"
  27. #endif
  28.  
  29. #ifndef _SAMPLECOLLECTIONS_
  30. #include "SampleCollections.h"
  31. #endif
  32.  
  33. // -- OpenDoc Includes --
  34.  
  35. #ifndef _ODTYPES_
  36. #include <ODTypes.h>
  37. #endif
  38.  
  39. #ifndef SOM_ODPart_xh
  40. #include <Part.xh>
  41. #endif
  42.  
  43. #ifndef SOM_ODFacet_xh
  44. #include <Facet.xh>
  45. #endif
  46.  
  47. #ifndef SOM_ODFrame_xh
  48. #include <Frame.xh>
  49. #endif
  50.  
  51. #ifndef SOM_ODFrameFacetIterator_xh
  52. #include <FrFaItr.xh>
  53. #endif
  54.  
  55. #ifndef SOM_ODDraft_xh
  56. #include <Draft.xh>
  57. #endif
  58.  
  59. // -- OpenDoc Utilities --
  60.  
  61. #ifndef _ODUTILS_
  62. #include <ODUtils.h>
  63. #endif
  64.  
  65. #ifndef _EXCEPT_
  66. #include <Except.h>
  67. #endif
  68.  
  69. #ifndef _TEMPOBJ_
  70. #include <TempObj.h>
  71. #endif
  72.  
  73. #ifndef _TEMPITER_
  74. #include <TempIter.h>
  75. #endif
  76.  
  77.  
  78. #pragma segment PanelEditorPanel
  79.  
  80. //==============================================================================
  81. // CFrame
  82. //==============================================================================
  83.  
  84. //------------------------------------------------------------------------------
  85. // Method:        Constructor
  86. //
  87. // Description:    This is the C++ class constructor.
  88. //------------------------------------------------------------------------------
  89.  
  90. CFrame::CFrame()
  91. {
  92.     fContainingFrames = kODNULL;
  93.     fFrames = kODNULL;
  94.     fPartDisplayed = kODNULL;
  95.     fInited = kODFalse;
  96. }
  97.  
  98. //------------------------------------------------------------------------------
  99. // Method:        InitPanel
  100. //
  101. // Description:    This is the C++ class constructor.
  102. //------------------------------------------------------------------------------
  103.  
  104. void CFrame::InitFrame()
  105. {
  106.     fContainingFrames = new CFrameList;
  107.     fFrames = new CFrameList;
  108.     fInited = kODTrue;
  109. }
  110.  
  111. //------------------------------------------------------------------------------
  112. // Method:        Destructor
  113. //
  114. // Description:    This is the C++ class Destructor.
  115. //------------------------------------------------------------------------------
  116.  
  117. CFrame::~CFrame()
  118. {
  119.     ASSERT(fInited != kODFalse, kAssertionFailed);
  120.  
  121.     ODDeleteObject(fContainingFrames);
  122.     ODDeleteObject(fFrames);
  123.     ODSafeReleaseObject(fPartDisplayed);
  124. }
  125.  
  126. //------------------------------------------------------------------------------
  127. // Method:        NewFrame
  128. //
  129. // Description:    This method is called in response to 
  130. //------------------------------------------------------------------------------
  131.  
  132. void CFrame::NewFrame(Environment* ev, ODFrame* containingFrame)
  133. {
  134.     ASSERT(fInited != kODFalse, kAssertionFailed);
  135.  
  136.     ODDraft* draft = ODGetDraft(ev, containingFrame);
  137.     
  138.     ODRect bounds = this->GetFrameBounds(ev, containingFrame);
  139.  
  140.     TempODShape frameShape = containingFrame->CreateShape(ev);
  141.     frameShape->SetRectangle(ev, &bounds);
  142.         
  143.     TempODFrame frame = draft->CreateFrame(ev, this->GetFrameType(),
  144.                                     containingFrame, frameShape, kODNULL,
  145.                                     fPartDisplayed, gGlobals->fFrameView,
  146.                                     this->GetPresentation(),
  147.                                     this->MakeSubframe(), kODFalse);
  148.     this->PrepareFrame(ev,frame);
  149.     
  150.     fFrames->Add(frame);
  151. }
  152.  
  153. //------------------------------------------------------------------------------
  154. // Method:        CreateFrames
  155. //
  156. // Description:    This method is called in response to 
  157. //------------------------------------------------------------------------------
  158.  
  159. void CFrame::CreateFrames( Environment*    ev )
  160. {
  161.     ASSERT(fInited != kODFalse, kAssertionFailed);
  162.  
  163.     CFrameListIterator fiter(fContainingFrames);
  164.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  165.              frame=fiter.Next() )
  166.     {
  167.         this->NewFrame(ev, frame);
  168.     }
  169. }
  170.  
  171. //------------------------------------------------------------------------------
  172. // Method:        CreateFacets
  173. //
  174. // Description:    This method is called in response to 
  175. //------------------------------------------------------------------------------
  176.  
  177. void CFrame::CreateFacets( Environment*    ev )
  178. {
  179.     ASSERT(fInited != kODFalse, kAssertionFailed);
  180.  
  181.     CFrameListIterator fiter(fFrames);
  182.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  183.              frame=fiter.Next() )
  184.     {
  185.         TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
  186.         
  187.         ODShape* frameShape = frame->AcquireFrameShape(ev, kODNULL);
  188.         TempODShape clipShape = ODCopyAndRelease(ev, frameShape);
  189.         
  190.         TempODTransform externalTransform = frame->CreateTransform(ev);
  191.         
  192.         Point offset = this->GetFrameOffset();
  193.         externalTransform->SetQDOffset(ev, &offset);
  194.         
  195.         TempODFrameFacetIterator fiter(ev, containingFrame);
  196.         for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
  197.                 facet = fiter.Next() )
  198.         {
  199.             facet->CreateEmbeddedFacet(ev, frame, clipShape,
  200.                                         externalTransform, kODNULL,
  201.                                         kODNULL, kODNULL,
  202.                                         kODFrameInFront);
  203.             this->PrepareFacet(ev,facet);
  204.         }
  205.     }
  206. }
  207.  
  208. //------------------------------------------------------------------------------
  209. // Method:        RemoveFacets
  210. //
  211. // Description:    This method is called in response to 
  212. //------------------------------------------------------------------------------
  213.  
  214. void CFrame::RemoveFacets(Environment* ev, ODFrame* containingFrame)
  215. {
  216.     ASSERT(fInited != kODFalse, kAssertionFailed);
  217.  
  218.     CFrameListIterator fiter(fFrames);
  219.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  220.              frame=fiter.Next() )
  221.     {
  222.         TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
  223.         if ( ODObjectsAreEqual(ev, parentFrame, containingFrame) )
  224.         {
  225.             frame->Invalidate(ev, kODNULL, kODNULL);
  226.             RemoveFacetsFromFrame(ev, frame);
  227.         }
  228.     }
  229. }
  230.  
  231. //------------------------------------------------------------------------------
  232. // Method:        AddFacets
  233. //
  234. // Description:    This method is called in response to 
  235. //------------------------------------------------------------------------------
  236.  
  237. void CFrame::AddFacets(Environment* ev, ODFrame* containingFrame)
  238. {
  239.     ASSERT(fInited != kODFalse, kAssertionFailed);
  240.  
  241.     CFrameListIterator fiter(fFrames);
  242.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  243.              frame=fiter.Next() )
  244.     {
  245.         TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
  246.         if ( ODObjectsAreEqual(ev, parentFrame, containingFrame) )
  247.         {
  248.             TempODFrameFacetIterator fiter(ev, containingFrame);
  249.             for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
  250.                     facet = fiter.Next() )
  251.             {
  252.                 this->AddFacet(ev, facet, frame);
  253.             }
  254.         }
  255.     }
  256. }
  257.  
  258. //------------------------------------------------------------------------------
  259. // Method:        RemoveAll
  260. //
  261. // Description:    This method is called in response to 
  262. //------------------------------------------------------------------------------
  263.  
  264. void CFrame::RemoveAll( Environment* ev )
  265. {
  266.     ASSERT(fInited != kODFalse, kAssertionFailed);
  267.  
  268.     CFrameListIterator fiter(fFrames);
  269.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  270.              frame=fiter.Next() )
  271.     {
  272.         // Remove and release the panel frame.
  273.         fiter.ReleaseCurrent();
  274.         
  275.         // Record the parent frames so that we are able to recreate
  276.         // things later.
  277.         TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
  278.         fContainingFrames->Add(containingFrame);
  279.         
  280.         // Delete all the facets.
  281.         frame->Invalidate(ev, kODNULL, kODNULL);
  282.         RemoveFacetsFromFrame(ev, frame);
  283.         // Last minute house cleaning.
  284.         this->CleanupFrame(ev,frame,kFrameRemoved);
  285.         // Remove the frame from the draft.
  286.         ODAcquireObject(ev,frame);
  287.         frame->Remove(ev);
  288.     }
  289. }
  290.  
  291. //------------------------------------------------------------------------------
  292. // Method:        AddFrame
  293. //
  294. // Description:    This method is called in response to 
  295. //------------------------------------------------------------------------------
  296.  
  297. void CFrame::AddFrame( Environment* ev, ODFrame* containingFrame )
  298. {
  299.     ASSERT(fInited != kODFalse, kAssertionFailed);
  300.  
  301.     // We lazily create the frames and facets because we dont' know
  302.     // which part is in the "selection" until facets have been created.
  303.     fContainingFrames->Add(containingFrame);
  304.     
  305.     // But, if we've already created and displayed frames, then we need to
  306.     // add a new frame now.
  307.     this->NewFrame(ev, containingFrame);
  308. }
  309.  
  310. //------------------------------------------------------------------------------
  311. // Method:        RemoveFrame
  312. //
  313. // Description:    This method is called in response to 
  314. //------------------------------------------------------------------------------
  315.  
  316. void CFrame::RemoveFrame( Environment* ev, ODFrame* containingFrame )
  317. {
  318.     ASSERT(fInited != kODFalse, kAssertionFailed);
  319.  
  320.     CFrameListIterator fiter(fFrames);
  321.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  322.              frame=fiter.Next() )
  323.     {
  324.         TempODFrame contFrame = frame->AcquireContainingFrame(ev);
  325.         if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
  326.         {
  327.             // Release our references to the frame and its containing frame.
  328.             fiter.ReleaseCurrent();
  329.         }
  330.  
  331.         // Delete all the facets and ask the frame to remove itself.
  332.         RemoveFacetsFromFrame(ev, frame);
  333.         ODAcquireObject(ev,frame);
  334.         // Last minute house cleaning.
  335.         this->CleanupFrame(ev,frame,kFrameRemoved);
  336.         frame->Remove(ev);
  337.     }
  338.  
  339.     // Remove the containing frame from our collections.
  340.     fContainingFrames->Remove(containingFrame);
  341. }
  342.  
  343. //------------------------------------------------------------------------------
  344. // Method:        CloseFrame
  345. //
  346. // Description:    This method is called in response to 
  347. //------------------------------------------------------------------------------
  348.  
  349. void CFrame::CloseFrame( Environment* ev, ODFrame* containingFrame )
  350. {
  351.     ASSERT(fInited != kODFalse, kAssertionFailed);
  352.  
  353.     CFrameListIterator fiter(fFrames);
  354.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  355.              frame=fiter.Next() )
  356.     {
  357.         TempODFrame contFrame = frame->AcquireContainingFrame(ev);
  358.         if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
  359.         {
  360.             // Release our references to the frame and its containing frame.
  361.             fiter.ReleaseCurrent();
  362.         }
  363.  
  364.         // Delete all the facets and ask the frame to remove itself.
  365.         RemoveFacetsFromFrame(ev, frame);
  366.         ODAcquireObject(ev,frame);
  367.         // Last minute house cleaning.
  368.         this->CleanupFrame(ev,frame,kFrameClosed);
  369.         frame->Close(ev);
  370.     }
  371.     
  372.     // Remove the containing frame from our collections.
  373.     fContainingFrames->Remove(containingFrame);
  374. }
  375.  
  376. //------------------------------------------------------------------------------
  377. // Method:        Resize
  378. //
  379. // Description:    This method is called when a containing frame of this frame has
  380. //                its frameshape changed.
  381. //------------------------------------------------------------------------------
  382.  
  383. void CFrame::Resize( Environment* ev, ODFrame* containingFrame )
  384. {
  385.     ASSERT(fInited != kODFalse, kAssertionFailed);
  386.  
  387.     CFrameListIterator fiter(fFrames);
  388.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  389.              frame=fiter.Next() )
  390.     {
  391.         // Calculate the panel frame's shape based on it's parent frame.
  392.         TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
  393.         
  394.         if ( ODObjectsAreEqual(ev, parentFrame, containingFrame) )
  395.         {        
  396.             ODRect bounds;
  397.             TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
  398.     
  399.             bounds = this->GetFrameBounds(ev,containingFrame);
  400.             
  401.             TempODShape newFrameShape = frame->CreateShape(ev);
  402.             newFrameShape->SetRectangle(ev, &bounds);
  403.             
  404.             // Change the panel frame shape.
  405.             frame->ChangeFrameShape(ev, newFrameShape, kODNULL);
  406.             
  407.             // Iterate over the frame's facets and change their clip shapes.
  408.                     
  409.             TempODFrameFacetIterator fiter(ev, frame);
  410.             for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
  411.                     facet = fiter.Next() )
  412.             {
  413.                 TempODShape newClipShape = newFrameShape->Copy(ev);
  414.                 facet->ChangeGeometry(ev, newClipShape, kODNULL, kODNULL);
  415.                 this->FacetChanged(ev,facet);
  416.             }
  417.         }
  418.     }
  419. }
  420.  
  421. //------------------------------------------------------------------------------
  422. // Method:        AttachSourceFrame
  423. //
  424. // Description:    This method is called in response to 
  425. //------------------------------------------------------------------------------
  426.  
  427. void CFrame::AttachSourceFrame(Environment* ev, ODFrame* contFrame,
  428.                                 ODFrame* srcContFrame)
  429. {
  430.     ASSERT(fInited != kODFalse, kAssertionFailed);
  431.  
  432.     ODFrame* frame = kODNULL;
  433.     ODFrame* srcFrame = kODNULL;
  434.     
  435.     CFrameListIterator fiter(fFrames);
  436.     for ( frame=fiter.First();fiter.IsNotComplete();
  437.              frame=fiter.Next() )
  438.     {
  439.         TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
  440.         if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
  441.             break;
  442.     }
  443.  
  444.     for ( srcFrame=fiter.First();fiter.IsNotComplete();
  445.              srcFrame=fiter.Next() )
  446.     {
  447.         TempODFrame containingFrame = srcFrame->AcquireContainingFrame(ev);
  448.         if ( ODObjectsAreEqual(ev, srcContFrame, containingFrame) )
  449.             break;
  450.     }
  451.  
  452.     if ( frame && srcFrame )
  453.         fPartDisplayed->AttachSourceFrame(ev,frame,srcFrame);
  454. }
  455.  
  456. //------------------------------------------------------------------------------
  457. // Method:        RemoveFacet
  458. //
  459. // Description:    This method is called when
  460. //------------------------------------------------------------------------------
  461.  
  462. void CFrame::RemoveFacet(Environment* ev, ODFacet* containingFacet)
  463. {
  464.     ASSERT(fInited != kODFalse, kAssertionFailed);
  465.  
  466.     CList* tList = new CList;
  467.  
  468.     CFrameListIterator fiter(fFrames);
  469.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  470.              frame=fiter.Next() )
  471.     {
  472.         TempODFrameFacetIterator fiter(ev, frame);
  473.         for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
  474.                 facet = fiter.Next() )
  475.         {
  476.             if ( ODObjectsAreEqual(ev, facet->GetContainingFacet(ev), containingFacet) )
  477.                 tList->Add((ODPtr)facet);
  478.         }
  479.     }
  480.  
  481.     CListIterator iter(tList);
  482.     for ( ODFacet* facet=(ODFacet*)iter.First();iter.IsNotComplete();
  483.              facet=(ODFacet*)iter.Next() )
  484.     {
  485.         iter.RemoveCurrent();
  486.         this->RemoveFacet(ev, containingFacet, facet);
  487.     }
  488.     delete tList;
  489. }
  490.  
  491. //------------------------------------------------------------------------------
  492. // Method:        RemoveFacet
  493. //
  494. // Description:    This method is called when
  495. //------------------------------------------------------------------------------
  496.  
  497. void CFrame::RemoveFacet(Environment* ev, ODFacet* containingFacet, ODFacet* facet)
  498. {
  499.     ASSERT(fInited != kODFalse, kAssertionFailed);
  500.  
  501.     // Remove the facet from the visible hierarchy.
  502.     containingFacet->RemoveFacet(ev, facet);
  503.     // Last minute cleanup.
  504.     this->CleanupFacet(ev,facet);
  505.     // Delete the facet.
  506.     ODDeleteObject(facet);
  507. }
  508.  
  509. //------------------------------------------------------------------------------
  510. // Method:        AddFacet
  511. //
  512. // Description:    This method is called when
  513. //------------------------------------------------------------------------------
  514.  
  515. void CFrame::AddFacet(Environment* ev, ODFacet* containingFacet)
  516. {
  517.     ASSERT(fInited != kODFalse, kAssertionFailed);
  518.  
  519.     // Things are done lazily, so don't create a facet unless we
  520.     // really need to.
  521.  
  522.     ODFrame* containingFrame = containingFacet->GetFrame(ev);
  523.     
  524.     CFrameListIterator fiter(fFrames);
  525.     for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
  526.              frame=fiter.Next() )
  527.     {
  528.         TempODFrame contFrame = frame->AcquireContainingFrame(ev);
  529.     
  530.         if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
  531.             this->AddFacet(ev, containingFacet, frame);
  532.     }
  533. }
  534.  
  535. //------------------------------------------------------------------------------
  536. // Method:        AddFacet
  537. //
  538. // Description:    This method is called when
  539. //------------------------------------------------------------------------------
  540.  
  541. void CFrame::AddFacet(Environment* ev, ODFacet* containingFacet, ODFrame* frame)
  542. {
  543.     ODShape* frameShape = frame->AcquireFrameShape(ev, kODNULL);
  544.     TempODShape clipShape = ODCopyAndRelease(ev, frameShape);
  545.     
  546.     TempODTransform externalTransform = frame->CreateTransform(ev);
  547.     
  548.     Point offset = this->GetFrameOffset(); 
  549.     externalTransform->SetQDOffset(ev, &offset);
  550.     
  551.     ODFacet* facet = containingFacet->CreateEmbeddedFacet
  552.                                         (ev, frame, clipShape,
  553.                                         externalTransform, kODNULL,
  554.                                         kODNULL, kODNULL,
  555.                                         kODFrameInFront);
  556.     this->PrepareFacet(ev,facet);
  557. }
  558.  
  559.  
  560.